package sv.com.renacempleo.dao.red;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import sv.com.renacempleo.dao.BaseDaoImpl;
import sv.com.renacempleo.dto.red.RedEmpresaSucursales;
import sv.com.renacempleo.exception.WebException;

public class RedEmpresaSucursalesDaoImpl extends BaseDaoImpl implements RedEmpresaSucursalesDao{

	@SuppressWarnings("unchecked")
	public List<Object[]> findAllByEmpresa(Long redEmpresaFolio) throws WebException {
		DetachedCriteria criteria = DetachedCriteria.forClass(RedEmpresaSucursales.class);
		criteria.addOrder(Order.asc("redEmpresaSucursalId"));
		criteria.createAlias("ctgMunicipio", "ctgMunicipio");
		criteria.createAlias("redEmpresaFolio", "redEmpresa");
		criteria.setProjection(Projections.projectionList().
			add(Projections.property("redEmpresaSucursalId")).
			add(Projections.property("redEmpresaSucursalNombre")).
			add(Projections.property("redEmpresaSucursalDireccion")).
			add(Projections.property("ctgMunicipio.ctgMunicipioId")).
			add(Projections.property("ctgMunicipio.ctgMunicipioNombre")).
			add(Projections.property("redEmpresaSucursalTelefono")).
			add(Projections.property("redEmpresaSucursaFax")).
			add(Projections.property("redEmpresaSucursalEmail")).
			add(Projections.property("redEmpresaSucursalCentral")).
			add(Projections.property("redEmpresa.redEmpresaFolio"))
		);
		return (List<Object[]>) findByCriteria(criteria);
	}

	@SuppressWarnings("unchecked")
	public List<Object[]> findAllByMunicipio(Long ctgMunicipioId)
			throws WebException {
		DetachedCriteria criteria = DetachedCriteria.forClass(RedEmpresaSucursales.class);
		criteria.addOrder(Order.asc("redEmpresaSucursalId"));
		criteria.createAlias("ctgMunicipio", "ctgMunicipio");
		criteria.createAlias("ctgDepartamento", "ctgMunicipio.ctgDepartamento");
		criteria.add(Restrictions.eq("ctgMunicipio.ctgMunicipioId", ctgMunicipioId));
		criteria.setProjection(Projections.projectionList().
			add(Projections.property("redEmpresaSucursalId")).
			add(Projections.property("redEmpresaSucursalNombre")).
			add(Projections.property("redEmpresaSucursalDireccion")).
			add(Projections.property("ctgMunicipio.ctgMunicipioId")).
			add(Projections.property("ctgMunicipio.ctgMunicipioNombre")).
			add(Projections.property("ctgDepartamento.ctgDepartamentoId")).
			add(Projections.property("ctgDepartamento.ctgDepartamentoNombre")).
			add(Projections.property("redEmpresaSucursalTelefono")).
			add(Projections.property("redEmpresaSucursaFax")).
			add(Projections.property("redEmpresaSucursalEmail"))
		);
		return (List<Object[]>) findByCriteria(criteria);
	}

	@SuppressWarnings("unchecked")
	public List<Object[]> findAllByDepartamento(Long ctgDepartamentoId)
			throws WebException {
		DetachedCriteria criteria = DetachedCriteria.forClass(RedEmpresaSucursales.class);
		criteria.addOrder(Order.asc("redEmpresaSucursalId"));
		criteria.createAlias("ctgMunicipio", "ctgMunicipio");
		criteria.createAlias("ctgDepartamento", "ctgMunicipio.ctgDepartamento");
		criteria.add(Restrictions.eq("ctgDepartamento.ctgDepartamentoId", ctgDepartamentoId));
		criteria.setProjection(Projections.projectionList().
			add(Projections.property("redEmpresaSucursalId")).
			add(Projections.property("redEmpresaSucursalNombre")).
			add(Projections.property("redEmpresaSucursalDireccion")).
			add(Projections.property("ctgMunicipio.ctgMunicipioId")).
			add(Projections.property("ctgMunicipio.ctgMunicipioNombre")).
			add(Projections.property("ctgDepartamento.ctgDepartamentoId")).
			add(Projections.property("ctgDepartamento.ctgDepartamentoNombre")).
			add(Projections.property("redEmpresaSucursalTelefono")).
			add(Projections.property("redEmpresaSucursaFax")).
			add(Projections.property("redEmpresaSucursalEmail"))
		);
		return (List<Object[]>) findByCriteria(criteria);
	}

}
